home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 108_01 / cb.c < prev    next >
Text File  |  1985-11-13  |  8KB  |  420 lines

  1. /*
  2.     Pretty-printer for C Programs
  3.  
  4.     Swiped from the CIPG's UNIX system and modified to run
  5.         under BDS C by William C. Colley, III
  6.  
  7.     Mods made July 1980
  8.  
  9. To use the program, type the following command line:
  10.  
  11.     A>cb input.fil [output.fil]
  12.  
  13. where input.fil is the file to be pretty-printed and [output.fil] is an
  14. optional output file.  If no output file is specified, the output is sent
  15. to the console.
  16. */
  17.  
  18. int slevel[10];
  19. int clevel;
  20. int spflg[20][10];
  21. int sind[20][10];
  22. int siflev[10];
  23. int sifflg[10];
  24. int iflev;
  25. int ifflg;
  26. int level;
  27. int ind[10];
  28. int eflg;
  29. int paren;
  30. int pflg[10];
  31. char lchar;
  32. char pchar;
  33. int aflg;
  34. int ct;
  35. int stabs[20][10];
  36. int qflg;
  37. char *wif[2];
  38. char *welse[2];
  39. char *wfor[2];
  40. char *wds[3];
  41. int j;
  42. char string[200];
  43. char cc;
  44. int sflg;
  45. int bflg;
  46. int peek;
  47. int tabs;
  48. char lastchar;
  49. char c;
  50.  
  51. /*  Added disk I/O buffers, etc.:  */
  52.  
  53. char inpbuf[134], outbuf[134], *outvect;
  54.  
  55. main(argc,argv)
  56. int argc;
  57. char *argv[];
  58. {
  59.     int k;
  60.  
  61.     /*  Initialize everything here.  */
  62.  
  63.     outvect = 1;
  64.     if (argc < 2 || argc > 3){
  65.         printf("Usage:  A>cb input.fil [output.fil\n");
  66.         exit();
  67.     }
  68.     if (fopen(*++argv,inpbuf) == -1){
  69.         printf("File not found\n\n");
  70.         exit();
  71.     }
  72.     if (argc == 3){
  73.         if (fcreat(*++argv,outbuf) == -1){
  74.             printf("Could not create output file\n");
  75.             exit();
  76.         }
  77.         outvect = outbuf;
  78.     }
  79.     clevel = iflev = level = eflg = paren = 0;
  80.     aflg = qflg = j = bflg = tabs = 0;
  81.     ifflg = peek = -1;
  82.     sflg = 1;
  83.     initw(ind,"0,0,0,0,0,0,0,0,0,0");
  84.     initw(pflg,"0,0,0,0,0,0,0,0,0,0");
  85.     wif[0] = "if";
  86.     welse[0] = "else";
  87.     wfor[0] = "for";
  88.     wds[0] = "case";
  89.     wds[1] = "default";
  90.     wif[1] = welse[1] = wfor[1] = wds[2] = 0;
  91.  
  92.     /*  End of initialization.  */
  93.  
  94.     while((c = getchr()) != 032){
  95.         switch(c){
  96.         default:
  97.             string[j++] = c;
  98.             if(c != ',')lchar = c;
  99.             break;
  100.         case ' ':
  101.         case '\t':
  102.             if(lookup(welse) == 1){
  103.                 gotelse();
  104.                 if(sflg == 0 || j > 0)string[j++] = c;
  105.                 puts();
  106.                 sflg = 0;
  107.                 break;
  108.             }
  109.             if(sflg == 0 || j > 0)string[j++] = c;
  110.             break;
  111.         case '\n':
  112.             if(eflg = lookup(welse) == 1)gotelse();
  113.             puts();
  114.             printf("\n");
  115.             sflg = 1;
  116.             if(eflg == 1){
  117.                 pflg[level]++;
  118.                 tabs++;
  119.             }
  120.             else
  121.                 if(pchar == lchar)
  122.                     aflg = 1;
  123.             break;
  124.         case '{':
  125.             if(lookup(welse) == 1)gotelse();
  126.             siflev[clevel] = iflev;
  127.             sifflg[clevel] = ifflg;
  128.             iflev = ifflg = 0;
  129.             clevel++;
  130.             if(sflg == 1 && pflg[level] != 0){
  131.                 pflg[level]--;
  132.                 tabs--;
  133.             }
  134.             string[j++] = c;
  135.             puts();
  136.             getnl();
  137.             puts();
  138.             printf("\n");
  139.             tabs++;
  140.             sflg = 1;
  141.             if(pflg[level] > 0){
  142.                 ind[level] = 1;
  143.                 level++;
  144.                 slevel[level] = clevel;
  145.             }
  146.             break;
  147.         case '}':
  148.             clevel--;
  149.             if((iflev = siflev[clevel]-1) < 0)iflev = 0;
  150.             ifflg = sifflg[clevel];
  151.             puts();
  152.             tabs--;
  153.             ptabs();
  154.             if((peek = getchr()) == ';'){
  155.                 printf("%c;",c);
  156.                 peek = -1;
  157.             }
  158.             else printf("%c",c);
  159.             getnl();
  160.             puts();
  161.             printf("\n");
  162.             sflg = 1;
  163.             if(clevel < slevel[level])if(level > 0)level--;
  164.             if(ind[level] != 0){
  165.                 tabs -= pflg[level];
  166.                 pflg[level] = 0;
  167.                 ind[level] = 0;
  168.             }
  169.             break;
  170.         case '"':
  171.         case '\'':
  172.             string[j++] = c;
  173.             while((cc = getchr()) != c){
  174.                 string[j++] = cc;
  175.                 if(cc == '\\'){
  176.                     string[j++] = getchr();
  177.                 }
  178.                 if(cc == '\n'){
  179.                     puts();
  180.                     sflg = 1;
  181.                 }
  182.             }
  183.             string[j++] = cc;
  184.             if(getnl() == 1){
  185.                 lchar = cc;
  186.                 peek = '\n';
  187.             }
  188.             break;
  189.         case ';':
  190.             string[j++] = c;
  191.             puts();
  192.             if(pflg[level] > 0 && ind[level] == 0){
  193.                 tabs -= pflg[level];
  194.                 pflg[level] = 0;
  195.             }
  196.             getnl();
  197.             puts();
  198.             printf("\n");
  199.             sflg = 1;
  200.             if(iflev > 0)
  201.                 if(ifflg == 1){iflev--;
  202.                     ifflg = 0;
  203.                 }
  204.                 else iflev = 0;
  205.             break;
  206.         case '\\':
  207.             string[j++] = c;
  208.             string[j++] = getchr();
  209.             break;
  210.         case '?':
  211.             qflg = 1;
  212.             string[j++] = c;
  213.             break;
  214.         case ':':
  215.             string[j++] = c;
  216.             if(qflg == 1){
  217.                 qflg = 0;
  218.                 break;
  219.             }
  220.             if(lookup(wds) == 0){
  221.                 sflg = 0;
  222.                 puts();
  223.             }
  224.             else{
  225.                 tabs--;
  226.                 puts();
  227.                 tabs++;
  228.             }
  229.             if((peek = getchr()) == ';'){
  230.                 printf(";");
  231.                 peek = -1;
  232.             }
  233.             getnl();
  234.             puts();
  235.             printf("\n");
  236.             sflg = 1;
  237.             break;
  238.         case '/':
  239.             string[j++] = c;
  240.             if((peek = getchr()) != '*')break;
  241.             string[j++] = peek;
  242.             peek = -1;
  243.             comment();
  244.             break;
  245.         case ')':
  246.             paren--;
  247.             string[j++] = c;
  248.             puts();
  249.             if(getnl() == 1){
  250.                 peek = '\n';
  251.                 if(paren != 0)aflg = 1;
  252.                 else if(tabs > 0){
  253.                     pflg[level]++;
  254.                     tabs++;
  255.                     ind[level] = 0;
  256.                 }
  257.             }
  258.             break;
  259.         case '#':
  260.             string[j++] = c;
  261.             while((cc = getchr()) != '\n')string[j++] = cc;
  262.             string[j++] = cc;
  263.             sflg = 0;
  264.             puts();
  265.             sflg = 1;
  266.             break;
  267.         case '(':
  268.             string[j++] = c;
  269.             paren++;
  270.             if(lookup(wfor) == 1){
  271.                 while((c = gets()) != ';');
  272.                 ct=0;
  273. cont:
  274.                 while((c = gets()) != ')'){
  275.                     if(c == '(') ct++;
  276.                 }
  277.                 if(ct != 0){
  278.                     ct--;
  279.                     goto cont;
  280.                 }
  281.                 paren--;
  282.                 puts();
  283.                 if(getnl() == 1){
  284.                     peek = '\n';
  285.                     pflg[level]++;
  286.                     tabs++;
  287.                     ind[level] = 0;
  288.                 }
  289.                 break;
  290.             }
  291.             if(lookup(wif) == 1){
  292.                 puts();
  293.                 stabs[clevel][iflev] = tabs;
  294.                 spflg[clevel][iflev] = pflg[level];
  295.                 sind[clevel][iflev] = ind[level];
  296.                 iflev++;
  297.                 ifflg = 1;
  298.             }
  299.         }
  300.     }
  301.     if (outvect != 1){
  302.         printf("\032");
  303.         fflush(outbuf);
  304.     }
  305.     exit();
  306. }
  307. ptabs(){
  308.     int i;
  309.     for(i=0; i < tabs; i++)printf("\t");
  310. }
  311. getchr(){
  312.     if(peek < 0 && lastchar != ' ' && lastchar != '\t')pchar = lastchar;
  313.     lastchar = (peek<0) ? getc(inpbuf):peek;
  314.     peek = -1;
  315.     return(lastchar == '\r' ? getchr():lastchar);
  316. }
  317. puts(){
  318.     if(j > 0){
  319.         if(sflg != 0){
  320.             ptabs();
  321.             sflg = 0;
  322.             if(aflg == 1){
  323.                 aflg = 0;
  324.                 if(tabs > 0)printf("    ");
  325.             }
  326.         }
  327.         string[j] = '\0';
  328.         printf("%s",string);
  329.         j = 0;
  330.     }
  331.     else{
  332.         if(sflg != 0){
  333.             sflg = 0;
  334.             aflg = 0;
  335.         }
  336.     }
  337. }
  338. lookup(tab)
  339. char *tab[];
  340. {
  341.     char r;
  342.     int l,kk,k,i;
  343.     if(j < 1)return(0);
  344.     kk=0;
  345.     while(string[kk] == ' ')kk++;
  346.     for(i=0; tab[i] != 0; i++){
  347.         l=0;
  348.         for(k=kk;(r = tab[i][l++]) == string[k] && r != '\0';k++);
  349.         if(r == '\0' && (string[k] < 'a' || string[k] > 'z'))return(1);
  350.     }
  351.     return(0);
  352. }
  353. gets(){
  354.     char ch;
  355. beg:
  356.     if((ch = string[j++] = getchr()) == '\\'){
  357.         string[j++] = getchr();
  358.         goto beg;
  359.     }
  360.     if(ch == '\'' || ch == '"'){
  361.         while((cc = string[j++] = getchr()) != ch)if(cc == '\\')string[j++] = getchr();
  362.         goto beg;
  363.     }
  364.     if(ch == '\n'){
  365.         puts();
  366.         aflg = 1;
  367.         goto beg;
  368.     }
  369.     else return(ch);
  370. }
  371. gotelse(){
  372.     tabs = stabs[clevel][iflev];
  373.     pflg[level] = spflg[clevel][iflev];
  374.     ind[level] = sind[clevel][iflev];
  375.     ifflg = 1;
  376. }
  377. getnl(){
  378.     while((peek = getchr()) == '\t' || peek == ' '){
  379.         string[j++] = peek;
  380.         peek = -1;
  381.     }
  382.     if((peek = getchr()) == '/'){
  383.         peek = -1;
  384.         if((peek = getchr()) == '*'){
  385.             string[j++] = '/';
  386.             string[j++] = '*';
  387.             peek = -1;
  388.             comment();
  389.         }
  390.         else string[j++] = '/';
  391.     }
  392.     if((peek = getchr()) == '\n'){
  393.         peek = -1;
  394.         return(1);
  395.     }
  396.     return(0);
  397. }
  398. comment(){
  399. rep:
  400.     while((c = string[j++] = getchr()) != '*')
  401.         if(c == '\n'){
  402.             puts();
  403.             sflg = 1;
  404.         }
  405. gotstar:
  406.     if((c = string[j++] = getchr()) != '/'){
  407.         if(c == '*')goto gotstar;
  408.         goto rep;
  409.     }
  410. }
  411. printf(format,arg)
  412. char *format;
  413. unsigned arg;
  414. {
  415.     if (fprintf(outvect,format,arg) == -1){
  416.         fprintf(1,"Disk write error\n");
  417.         exit();
  418.     }
  419. }
  420.